/// 日志文件的元信息。
///
/// 用于承载平台返回或 Dart 枚举得到的日志文件数据，包含：
/// - [path]：文件绝对路径；
/// - [sizeBytes]：文件大小（字节）；
/// - [modifiedMs]：最后修改时间（毫秒时间戳）。
class PDLogFile {
  /// 友好可读的文件名称。
  ///
  /// - 当路径形如 `.../<year>/<month>/<day>.log` 时，返回 `YYYY-MM-DD.log`；
  /// - 否则返回原始文件名（最后一段路径）。
  /// - 不依赖 `dart:io`，通过字符串解析实现，跨平台有效。
  String get fileName {
    if (path.isEmpty) return '';
    // 归一化分隔符，兼容 Windows 路径
    final normalized = path.replaceAll('\\', '/');
    final parts = normalized.split('/');
    if (parts.length >= 3) {
      final dayLog = parts[parts.length - 1];
      final month = parts[parts.length - 2];
      final year = parts[parts.length - 3];
      final isYear = RegExp(r'^\d{4}$').hasMatch(year);
      final isMonth = RegExp(r'^\d{2}$').hasMatch(month);
      final isDayLog = RegExp(r'^\d{2}\.log$').hasMatch(dayLog);
      if (isYear && isMonth && isDayLog) {
        // 拼接为 YYYY-MM-dd.log
        return '$year-$month-$dayLog';
      }
    }
    // 兜底：返回 basename
    final lastSep = normalized.lastIndexOf('/');
    return lastSep >= 0 ? normalized.substring(lastSep + 1) : normalized;
  }

  /// 派生字段：年份（从路径解析，失败返回 null）。
  int? get year {
    if (path.isEmpty) return null;
    final normalized = path.replaceAll('\\', '/');
    final parts = normalized.split('/');
    if (parts.length >= 3) {
      final y = parts[parts.length - 3];
      final dl = parts.last;
      // 仅当最后一段为形如 `dd.log` 时才认为路径符合规范
      final isDayLog = RegExp(r'^\d{2}\.log$').hasMatch(dl);
      if (isDayLog && RegExp(r'^\d{4}$').hasMatch(y)) {
        return int.tryParse(y);
      }
    }
    return null;
  }

  /// 派生字段：月份（从路径解析，失败返回 null）。
  int? get month {
    if (path.isEmpty) return null;
    final normalized = path.replaceAll('\\', '/');
    final parts = normalized.split('/');
    if (parts.length >= 2) {
      final m = parts[parts.length - 2];
      final dl = parts.last;
      // 仅当最后一段为形如 `dd.log` 时才认为路径符合规范
      final isDayLog = RegExp(r'^\d{2}\.log$').hasMatch(dl);
      if (isDayLog && RegExp(r'^\d{2}$').hasMatch(m)) {
        return int.tryParse(m);
      }
    }
    return null;
  }

  /// 派生字段：日（从路径解析，失败返回 null）。
  int? get day {
    if (path.isEmpty) return null;
    final normalized = path.replaceAll('\\', '/');
    final parts = normalized.split('/');
    if (parts.isNotEmpty) {
      final dl = parts.last;
      final m = RegExp(r'^(\d{2})\.log$').firstMatch(dl);
      if (m != null) {
        return int.tryParse(m.group(1)!);
      }
    }
    return null;
  }

  /// 文件绝对路径。
  final String path;

  /// 文件大小（字节）。
  final int sizeBytes;

  /// 最后修改时间（毫秒时间戳）。
  final int modifiedMs;

  /// 构造一个日志文件元信息。
  const PDLogFile({
    required this.path,
    required this.sizeBytes,
    required this.modifiedMs,
  });

  /// 从 `Map` 构建 [PDLogFile]，容错处理空值。
  factory PDLogFile.fromMap(Map<String, dynamic> map) {
    return PDLogFile(
      path: (map['path'] as String?) ?? '',
      sizeBytes: (map['sizeBytes'] as int?) ?? 0,
      modifiedMs: (map['modifiedMs'] as int?) ?? 0,
    );
  }

  /// 转换为 JSON 对象。
  Map<String, dynamic> toJson() {
    return <String, dynamic>{
      'path': path,
      'sizeBytes': sizeBytes,
      'modifiedMs': modifiedMs,
    };
  }
}
